#!/bin/bash

# 检查参数是否正确
if [ $# -ne 1 ]; then
    echo "用法: $0 '<分钟> <小时> <日> <月> <星期> <任务脚本>'"
    echo "示例: $0 '* * * * * /path/to/script.sh'"
    exit 1
fi

# 获取输入参数并拆分
INPUT=$1
read -r MINUTE HOUR DAY MONTH WEEKDAY TASK <<< "$INPUT"

# 检查是否正确拆分为 6 个部分
if [ -z "$TASK" ]; then
    echo "参数格式错误，必须包含 5 个时间字段和任务脚本路径"
    echo "示例: $0 '* * * * * /path/to/script.sh'"
    exit 1
fi

# 检查任务脚本是否存在
if [ ! -f "$TASK" ]; then
    echo "任务脚本 $TASK 不存在"
    exit 1
fi

# 匹配 crontab 风格的通配符
match_cron() {
    local cron_val=$1  # crontab 输入值 (如 5, *, 0-23 等)
    local sys_val=$2   # 系统当前值 (如当前分钟、小时等)

    # 如果是通配符 *，直接匹配
    if [ "$cron_val" = "*" ]; then
        return 0
    fi

    # 支持逗号分隔的列表 (如 1,3,5)
    IFS=',' read -ra values <<< "$cron_val"
    for val in "${values[@]}"; do
        # 支持范围 (如 1-5)
        if [[ "$val" =~ ^([0-9]+)-([0-9]+)$ ]]; then
            start=${BASH_REMATCH[1]}
            end=${BASH_REMATCH[2]}
            if [ "$sys_val" -ge "$start" ] && [ "$sys_val" -le "$end" ]; then
                return 0
            fi
        # 单一值
        elif [ "$val" -eq "$sys_val" ]; then
            return 0
        fi
    done
    return 1
}

# 主循环
echo "定时任务启动，规则: $MINUTE $HOUR $DAY $MONTH $WEEKDAY"
while true; do
    # 获取当前时间
    current_minute=$(date +%M)
    current_hour=$(date +%H)
    current_day=$(date +%d)
    current_month=$(date +%m)
    current_weekday=$(date +%w)  # 0=星期日, 6=星期六

    # 检查是否匹配时间规则
    if match_cron "$MINUTE" "$current_minute" && \
       match_cron "$HOUR" "$current_hour" && \
       match_cron "$DAY" "$current_day" && \
       match_cron "$MONTH" "$current_month" && \
       match_cron "$WEEKDAY" "$current_weekday"; then
        echo "时间匹配: $(date) - 执行任务 $TASK"
        bash "$TASK"  # 执行任务脚本
        sleep 60      # 避免在一分钟内重复执行
    fi

    # 每秒检查一次
    sleep 1
done
